#pragma once

#include "Common.hpp"
#include "Connection.hpp"
#include "Socket.hpp"
#include "Channel.hpp"

#include <memory>

using namespace SocketModule;

class Listener : public Connection          // 监听者连接对象
{
public:

    Listener(int port)
        :_listenSock(std::make_unique<TcpSocket>())
        ,_port(port)
    {
        _listenSock->buildTcpSocketMethod(port);

        setEvent(EPOLLIN | EPOLLET);        // 输入 和 ET 模式

        setNonBlock(_listenSock->getFd());  // 无阻塞模式
    }

    void recver() override
    {
        InetAddr client;
        while (true)                    // 通知就绪的可能不只有一个，需要循环处理
        {
            int sockfd = _listenSock->acceptFd(client);
            // if(sockfd == ACCEPT_ERR)
            // {
            //     break;
            // }
            // else if(sockfd == ACCEPT_CONTINUE)
            // {
            //     continue;
            // }
            // else if(sockfd == ACCEPT_DONE)
            // {
            //     break;
            // }
            if (sockfd < 0)
            {
                break;
            }
            else
            {
                // 我们获得的是一个合法的 fd，普通的文件描述符
                std::shared_ptr<Connection> con = std::make_shared<Channel>(sockfd, client);

                con->setEvent(EPOLLIN | EPOLLET);
                if(_handler != nullptr)
                {
                    con->registerHandler(_handler);
                }

                getOwner()->addConnection(con);
            }
        }
    }

    void sender() override
    {
        ;
    }

    void excepter() override
    {
        ;
    }

    int getSockfd() override
    {
        return _listenSock->getFd();
    }

    ~Listener()
    {
        ;
    }
    
private:

    int _port;
    std::unique_ptr<Socket> _listenSock;
};